; (acumula combinador nulo f a prox b)

; Versão recursiva
(define (acumula combinador nulo f a prox b)
  (if (> a b)
      nulo
      (combinador (f a)
                  (acumula combinador nulo f (prox a) prox b))))

; Versão iterativa
(define (acumula-it combinador nulo f a prox b)
  (define (itera a resultado)
    (if (> a b)
        resultado
        (itera (prox a) (combinador (f a) resultado))))
  (itera a nulo))

(define (somatorio f a prox b)
  (acumula + 0 f a prox b))